home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
teco.zip
/
WORK.C
< prev
Wrap
C/C++ Source or Header
|
1986-07-15
|
12KB
|
373 lines
#include <ctype.h>
#include <stdio.h>
#include <string.h>
work()
{
#include "teco.h"
int iter; /* Iteration < > count */
int prefix; /* Non-zero if prefix */
int sign; /* Sign of number */
int tmp; /* Scratch variable */
int value; /* Value of number */
int wrk; /* Another scratch var. */
append(); /* Read in first buffer */
bufptx=0; /* Start at head of bfr */
loop: cancel=0; /* Show output allowed */
comand(); /* Get the comand strng */
getptx=0; /* Start of command buf */
iter=0; /* Not any <> iteration */
next: if (++getptx > getptr) { /* Any more commands? */
if (iter) fprintf(stderr,"?UTC, Unterminated command\n\7");
goto loop; /* ..yes then go again */
}
if (getbuf[getptx] == 27) goto next; /* Punt Delimiter */
prefix=0; /* No numeric arg */
sign=1; /* Default sign */
value=1; /* Default value */
if (getbuf[getptx] == '+') {
sign=1; /* Positive sign */
getptx++;
} else {
if (getbuf[getptx] == '-') {
sign=-1; /* Negative sign */
getptx++;
}
}
tmp=getptx; /* Start parse */
if (isdigit(getbuf[tmp])) { /* ...is number */
prefix=1; /* ...not deflt */
value=0; /* ...initialize */
while (isdigit(getbuf[tmp])) {
value=value*10+(getbuf[tmp++]-'0');
}
} else {
if (getbuf[tmp] == '.'){ /* Dot means THIS */
prefix=1; /* ....not deflt */
value=bufptx; /* Value is THIS */
tmp++; /* Accept it */
}
if (toupper(getbuf[tmp]) == 'B'){
prefix=1; /* ....not deflt */
value=0; /* Always is zero */
tmp++; /* Accept it */
}
if (toupper(getbuf[tmp]) == 'Z'){
prefix=1; /* ....not deflt */
value=bufptr; /* Value is END */
tmp++; /* Accept it */
}
}
number=sign*value; /* Specific value */
getptx=tmp; /* getptx --> Cmd */
verb=toupper(getbuf[getptx]); /* VERB is action */
if (verb == 27 ) goto next; /* Missing verb */
if (verb == '=') { /* Show our globl */
if (prefix) {
fprintf(stderr,"%d\n",number);
} else {
fprintf(stderr,"?NAE, No arg before =\n\7");
}
goto next; /* punt, all done */
} else {
adverb=toupper(getbuf[getptx+1]); /* verb qualifier */
} /* ...is adverb */
if (verb == '>') { /* End iteration */
if (!iter) { /* ..must exist */
fprintf(stderr,"?BNI, Not in iteration\n\7");
goto loop; /* ...flush buf */
}
if (--iter) { /* ..find start */
while (getbuf[--getptx] != '<');
} /* ..must exist */
goto next; /* ...continue */
}
if (verb == '<') { /* Iteration mode */
if (iter) { /* ...norecursiv */
fprintf(stderr,"?PDO, Push-down list overflow\n\7");
goto loop;
}
if (!prefix) { /* ...no limits */
iter=32766; /* ...big enuff */
} else { /* ...use his v */
iter=value; /* ...supplied */
} /* ...finished */
goto next; /* ...have more */
}
if (verb == 'A') { /* Append a page */
while (0 < number--) append(); /* ...with call */
goto next; /* ...punt this */
}
if (verb == 'C') { /* Advance char */
bufptx=bufptx+number; /* on request */
if (bufptx<0) { /* Insane request */
fprintf(stderr,"?POP, pointer off page\n\7");
bufptx=0; /* Minimum place */
goto loop; /* ...abort this */
}
if (bufptx>bufptr) { /* More insanity */
fprintf(stderr,"?POP, pointer off page\n\7");
bufptx=bufptr; /* Maximum place */
goto loop; /* ...abort this */
}
goto next; /* Eat some more */
}
if (verb == 'D') { /* Delete char */
if (number == 0) goto next; /* Must exist */
if (number < 0) { /* Delete backwds */
bufptx=bufptx+number; /* ...back up */
number=abs(number); /* ...magnitude */
} /* ...delete for */
if (bufptx < 0) { /* Sanity chk #1 */
fprintf(stderr,"?DTB, Delete too big\n\7");
goto loop; /* ...flush all */
} /* ...of buffer */
if (bufptx+number > bufptr) { /* Sanity chk #2 */
fprintf(stderr,"?DTB, Delete too big\n\7");
goto loop; /* ...flush all */
} /* ...of buffer */
memcpy(&buffer[bufptx+1],&buffer[bufptx+number+1],bufptr-bufptx);
bufptr=bufptr-number; /* Show deleted.. */
if (bufptr < bufptx) { /* ..not past nd */
bufptx=bufptr; /* Impose sanity */
} /* ..stop this */
goto next; /* ...punt this */
}
if (verb == 'E' ) { /* Buffer exits */
getptx++; /* Advance pointr */
if (adverb == 'F') return; /* Terminate file */
if (adverb == 'X') { /* Orderly exit */
while (bufptr) page(); /* Write out page */
return; /* ...and leave */
}
fprintf(stderr,"?IEC, Illegal character '%c' after E\n\7",adverb);
goto loop; /* Punt commands */
}
if (verb == 'F' ) { /* Replaqe string */
getptx++; /* Advance pointr */
if (adverb=='S' | adverb=='N') {/* ...replace cmd */
if (1 > number) {
fprintf(stderr,"?ISA, Illegal search arg\n\7");
goto loop;
}
if (getbuf[++getptx] == 27) goto next;
while (number--) { /* Scan from here */
if (adverb == 'S'){/* Local in scope */
search();
} else { /* Global replace */
next();
}
if (!bufptx) { /* ...not found */
tmp=getptx;
while (getbuf[++getptx] != 27);
getbuf[getptx]='\0';
fprintf(stderr,"?SRH, Search failure ");
fprintf(stderr,"'%s'\n\7",&getbuf[tmp]);
goto loop;
}
tmp=0;
while (getbuf[getptx + ++tmp] != 27);
memcpy(&buffer[bufptx],&buffer[bufptx+tmp],bufptr-bufptx);
bufptr=bufptr-tmp;
wrk=0;
while (getbuf[getptx + tmp + ++wrk] != 27);
wrk--;
bufptr++;
if (bufptr+wrk > bufsiz) {
fprintf(stderr,"?MEM, Memory overflow\n\7");
goto loop;
}
if (bufptr > bufptx) {
memcpy(&buffer[bufptx+wrk],&buffer[bufptx],bufptr-bufptx);
}
if (wrk > 0) {
memcpy(&buffer[bufptx],&getbuf[getptx+tmp+1],wrk);
}
bufptx--;
bufptr--;
bufptr=bufptr+wrk;
bufptx=bufptx+wrk;
}
while (getbuf[++getptx] != 27);
while (getbuf[++getptx] != 27);
goto next;
}
fprintf(stderr,"?ILL, Illegal command '%c%c'\n\7",verb,adverb);
goto loop;
}
if (verb == 'H' ) { /* Hole thingy */
getptx++; /* Advance pointr */
if (adverb == 'T') { /* Type the buffr */
tmp=0; /* Start at begin */
while (++tmp<=bufptr ){ /* ...start list */
echo(buffer[tmp]);
} /* ...all done */
goto next; /* ...fetch next */
}
if (adverb == 'K') { /* Kill the bufer */
bufptr=0; /* Nothing in it */
bufptx=0; /* Force at end */
goto next; /* Fetch next com */
}
fprintf(stderr,"?ILL, Illegal command '%c%c'\n\7",verb,adverb);
goto loop; /* Punt the error */
}
if (verb == 'I' | verb == 9) { /* Insert text */
if (verb == 'I') ++getptx; /* Skip 'I' only */
tmp=getptx; /* Grab a pointer */
if (prefix) { /* Character inst */
if (getbuf[tmp] != 27) {
fprintf(stderr,"?IIA, Illegal insert arg\n\7");
goto loop;
}
bufptr++;
bufptx++;
if (bufptr > bufsiz) {
fprintf(stderr,"?MEM, Memory overflow\n\7");
goto loop;
}
if (bufptr > bufptx) { /* Sanity check */
memcpy(&buffer[bufptx+1],&buffer[bufptx],bufptr-bufptx);
} /* ..only if sane */
buffer[bufptx]=toascii(number);
goto next; /* Eat some more */
}
while (getbuf[++tmp] != 27); /* Find string nd */
bufptr++;
bufptx++;
if (bufptr+tmp > bufsiz) {
fprintf(stderr,"?MEM, Memory overflow\n\7");
goto loop;
}
if (bufptr > bufptx) { /* Sanity check */
memcpy(&buffer[bufptx+tmp-getptx],&buffer[bufptx],bufptr-bufptx);
} /* ..only if sane */
memcpy(&buffer[bufptx],&getbuf[getptx],tmp-getptx);
bufptx--; /* Undo the fudge */
bufptr--; /* ...also fudge */
bufptr=bufptr+tmp-getptx; /* New buffer siz */
bufptx=bufptx+t